#ifndef UTILS_H
#define UTILS_H

#include <QSize>
#include "module_global.h"
#include <QObject>
#include <QApplication>
#include <QColorDialog>
#include <QDir>
#include <QFile>
#include <QCryptographicHash>

class MODULE_EXPORT  QUIUtils {
public:
    /**
         * @brief deskWidth 获取桌面宽度
         * @return
         */
    static int deskWidth();

    /**
         * @brief deskHeight 获取桌面高度
         * @return
         */
    static int deskHeight();

    /**
         * @brief appName 程序本身文件名称
         * @return
         */
    static QString appName();

    /**
         * @brief appPath 程序当前所在路径
         * @return
         */
    static QString appPath();

    /**
     * @brief initRand 初始化随机数种子
     */
    static void initRand();

    /**
     * @brief newDir 新建目录
     * @param dirName
     */
    static bool  newDir(const QString &dirName);

    /**
     * @brief removeDir 删除目录及目录下文件
     * @param dirName
     * @return
     */
    static bool removeDir(const QString &dirName);

    /**
     * @brief removeFile 删除文件
     * @param dirName
     * @return
     */
    static bool removeFile(const QString &dirName);

    /**
     * @brief copyFile 拷贝文件
     * @param fromFile
     * @param toFile
     * @return
     */
    static bool copyFile(QString fromFile, QString toFile);

    /**
     * @brief setBackground 设置背景色
     */
    static void setBackground(QWidget* obj,const QString &srcfile);

    /**
     * @brief setCodec 设置系统编码格式，默认utf-8
     * @param code
     */
    static void setCodec(const char* codec = "utf-8");

    /**
    * @brief msleep 休眠msec毫秒
    * @param sec
    */
    static void msleep(const int msec);

    /**
    * @brief delay_ms 休眠Time秒
    * @param sec
    */
    static void delay_ms(int Time, bool IsThread);

    /**
     * @brief checkIpValid 检测IP是否正确
     * @param ip
     * @return bool
     */
    static bool checkIpValid(const QString &ip);

    /**
     * @brief hexToQString
     * @param pHex
     * @param len
     * @return
     */
    static QString hexToQString(unsigned char *pHex, int len);

    /**
     * @brief setStyle 静态加载样式
     * @param style
     */
    static void setStyle(QWidget* pObj,const QString &style);

    /**
     * @brief setTranslator 设置翻译文件
     * @param qmFile
     */
    static void setTranslator(const QString &qmFile);

    /**
     * @brief setSystemTime 设置系统时间
     * @param year
     * @param month
     * @param day
     * @param hour
     * @param min
     * @param sec
     */
    static void setSystemTime(QString year, QString month,
                              QString day, QString hour,
                              QString min, QString sec);
    /**
     * @brief byteArrayToHexStr QByteArray转换成hex类型Qstring
     * @param data
     * @return
     */
    static QString byteArrayToHexStr(QByteArray data);

    /**
     * @brief isEnglish 判断字符串是否为纯字母
     * @param str
     * @return
     */
    static bool isEnglish(QString str);
    /**
     * @brief isNumber 判断字符串是否为纯数字
     * @param str
     * @return
     */
    static bool isNumber(QString str);

    /**
     * @brief readCSVFile 读取CSV文件数据
     * @param fileName
     */
    static QList<QStringList> readCSVFile(const QString fileName);

    static QString fileToBase64(const QString& filePath);

    static bool moveFile(const QString &sourcePath, const QString &destinationPath);

    static QString getCurrentTime();

    /**
     * @brief 递归复制文件夹中的所有文件和子文件夹到目标目录
     * @param sourceDir 源文件夹路径
     * @param destinationDir 目标文件夹路径
     */
    static bool copyFilesRecursively(const QString& sourceDir, const QString& destinationDir);
    /**
     * @brief 递归删除目录及其内容
     * @param dirPath 目录路径
     * @return 是否成功删除目录
     */
    static bool deleteDirectory(const QString &dirPath);
    /**
     * @brief 获取指定目录地址
     * @return 指定目录的地址，如果用户取消选择或发生错误，则返回空字符串
     */
    static QString getDirectoryPath();

    static bool writeToFile(const QString& filePath, const QString& content);

    static void deleteBackupFiles(const QString &path);
};


#endif // UTILS_H
